<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 继承是子类对象（派生）能够使用父类对象（基类）的数据（属性）和行为（方法）。
    // 继承：可以让子类拥有父类当中所有的属性以及方法。
    // - 原型链继承
    // - 缺点：父类当中提供的属性方法全部都来原型链。这些数据和方法对于实例而言是共享的。容易产生数据的混乱。
    {
        // function Box(){
        //     this.userName = "zhangsan";
        // }
        // function Desk(){
        //     this.age = 12;
        // }
        // Desk.prototype = new Box();
        // Desk.prototype.constructor = Desk;
        // const obj = new Desk();
        // const obj2 = new Desk();
        //
        // obj2.__proto__.userName = "wangwu";
        // console.log(obj2.userName)
        // console.log(obj.userName,obj.age);
        // console.log(obj.constructor === Desk);
        // console.log(obj.__proto__ === Desk.prototype);
        // console.log(Desk.prototype.__proto__ === Box.prototype);
        // console.log(Desk.prototype.__proto__.constructor === Box.prototype.constructor);
        // console.log(obj.constructor ===Box);
        // console.log(obj.constructor ===Desk);
        // console.log(obj)
    }






    // - 冒充继承：借用构造函数继承:只能够继承父类当中的实例，不会继承原型。
    //   - 缺点：无法继承父类的原型对象的方法。
    // {
    //     function Box(){
    //         this.userName = "zhangsan";
    //     }
    //     Box.prototype.run = function(){
    //
    //     }
    //     function Desk(){
    //         Box.call(this);
    //     }
    //     const obj = new Desk();
    //     // console.log(obj.userName);
    //     obj.run();
    // }



    // - 原型链+借用构造函数的组合继承
    {
        function Box(){
            this.userName = "zhangsan";
        }
        Box.prototype.run = function(){
            console.log(this.userName)
        }
        function Desk(){
            Box.call(this);
        }
        Desk.prototype = Box.prototype;
        Desk.prototype.constructor = Desk;
        const obj = new Desk();
        // console.log(obj.userName);
        obj.run();
    }
</script>
</html>